#pragma once

#include "IMessageHandler.h"
#include "SignatureHelper.h"
#include "EncryptionHelper.h"
#include <map>
#include <mutex>
#include <functional>

namespace MessageFramework {

/**
 * @brief 消息分发器
 *
 * 职责：
 * 1. 管理消息Handler注册表
 * 2. 根据messageType路由到对应Handler
 * 3. 统一的安全验证（签名、解密）
 * 4. 错误处理和日志记录
 *
 * 特性：
 * - 线程安全
 * - 支持动态注册/注销Handler
 * - 支持默认Handler（处理未知类型）
 */
class MessageDispatcher {
public:
    /**
     * @brief 分发结果
     */
    struct DispatchResult {
        int code;                   ///< 结果码（0=成功）
        std::string error;          ///< 错误信息
        std::string handlerName;    ///< 处理的Handler名称
    };

    /**
     * @brief 配置选项
     */
    struct Config {
        std::string secretKey;              ///< 签名密钥
        std::string encryptionKey;          ///< 加密密钥
        bool verifySignature = true;        ///< 是否验证签名
        int signatureTimeWindow = 60;       ///< 签名时间窗口（秒）
        bool autoDecrypt = true;            ///< 自动解密加密消息
    };

    MessageDispatcher() = default;
    explicit MessageDispatcher(const Config& config);

    /**
     * @brief 注册消息Handler
     */
    void registerHandler(const std::string& messageType, MessageHandlerPtr handler);

    /**
     * @brief 注销消息Handler
     */
    void unregisterHandler(const std::string& messageType);

    /**
     * @brief 分发消息
     *
     * 流程：
     * 1. 验证签名（可选）
     * 2. 解密消息体（可选）
     * 3. 查找Handler
     * 4. 调用Handler.handleMessage()
     *
     * @param message 消息
     * @return 分发结果
     */
    DispatchResult dispatch(Message& message);

    /**
     * @brief 设置默认Handler（处理未知类型）
     */
    void setDefaultHandler(MessageHandlerPtr handler);

    /**
     * @brief 设置配置
     */
    void setConfig(const Config& config);

    /**
     * @brief 获取已注册的Handler数量
     */
    size_t getHandlerCount() const;

    /**
     * @brief 获取已注册的消息类型列表
     */
    std::vector<std::string> getRegisteredTypes() const;

private:
    std::map<std::string, MessageHandlerPtr> m_handlers;  ///< Handler注册表
    MessageHandlerPtr m_defaultHandler;                   ///< 默认Handler
    Config m_config;                                       ///< 配置
    mutable std::mutex m_mutex;                           ///< 线程安全

    /**
     * @brief 验证消息签名
     */
    bool verifyMessageSignature(const Message& message) const;

    /**
     * @brief 解密消息体
     */
    std::string decryptMessageBody(const Message& message) const;
};

} // namespace MessageFramework
